package com.hvgroup.modules.sanic.service.impl.chat.chat;

import com.hvgroup.modules.sanic.domain.enums.PlatformType;
import com.hvgroup.modules.sanic.service.impl.chat.EventData;

import java.util.Map;
import java.util.function.BiFunction;

/**
 * 流式事件处理策略接口
 * 支持多平台/多类型事件动态路由与处理
 */
public interface EventHandler {

    /**
     * 判断当前事件是否由本 Handler 处理
     */
    boolean supports(Map<String, Object> eventMap);

    /**
     * 处理事件，返回递进后的 EventData 状态
     */
    EventData handle(Map<String, Object> eventMap, EventData preData);

    /**
     * 通用多级路径字符串提取（冒号分割）
     */
    default BiFunction<Map<String, Object>, String, String> processStr() {
        return (rootMap, path) -> {
            if (rootMap == null || path == null || path.isEmpty()) {
                return null;
            }
            String[] keys = path.split(":");
            Object current = rootMap;
            for (String key : keys) {
                if (!(current instanceof Map)) {
                    return null; // 中途遇到不是Map，直接退出
                }
                Map<?, ?> map = (Map<?, ?>) current;
                current = map.get(key);
                if (current == null) {
                    return null; // 任意层key不存在，返回null
                }
            }
            return String.valueOf(current);
        };
    }

    /**
     * 通用多级路径Map提取（冒号分割）
     */
    @SuppressWarnings("all")
    default BiFunction<Map<String, Object>, String, Map<String, Object>> processMap() {
        return (rootMap, path) -> {
            if (rootMap == null || path == null || path.isEmpty()) {
                return null;
            }
            String[] keys = path.split(":");
            Map<String, Object> current = rootMap;
            for (String key : keys) {
                Map<String, Object> map = current;
                current = (Map<String, Object>) map.get(key);
                if (current == null) {
                    return null; // 任意层key不存在，返回null
                }
            }
            return current;
        };
    }


    /**
     * 获取当前 Handler 处理的平台类型
     */
    PlatformType getType();

}
